home *** CD-ROM | disk | FTP | other *** search
Wrap
#include <Fonts.h> #include <Movies.h> #include <QD3D.h> #include <QD3DTransform.h> OSErr addTextureEntryToInputMapEntry(QTAtomContainer inputMap, long referenceIndex, char *name); void main(void) { OSErr err = noErr; OSType types; StandardFileReply threeDeeReply, movieReply; ThreeDeeDescriptionHandle sampleDescription = nil; short fref; AliasHandle alias = nil; long eof; Movie theMovie, inputMovie; Track threeDeeTrack; Media threeDeeMedia; Track inputVideoTrack, outputVideoTrack; FSSpec movieFSS; short movieResRef; short inputMovieResRef; long textureReference; QTAtomContainer inputMap; InitGraf(&qd.thePort); InitFonts(); InitWindows(); InitMenus(); TEInit(); InitDialogs(0L); InitCursor(); MaxApplZone(); EnterMovies(); // ask user for a 3D file types = '3DMF'; StandardGetFilePreview(nil, 1, &types, &threeDeeReply); if (!threeDeeReply.sfGood) return; // ask user for a movie file types = 'MooV'; StandardGetFilePreview(nil, 1, &types, &movieReply); if (!movieReply.sfGood) return; // figure out the size of the 3d file FSpOpenDF(&threeDeeReply.sfFile, fsRdPerm, &fref); GetEOF(fref, &eof); FSClose(fref); // make an alias to the file (QuickTime term: data reference) NewAliasMinimal(&threeDeeReply.sfFile, &alias); // make up a sample description for the 3d media sampleDescription = (ThreeDeeDescriptionHandle)NewHandleClear(sizeof(ThreeDeeDescription)); if (err = MemError()) return; (**sampleDescription).descSize = sizeof(ThreeDeeDescription); // create a movie file FSMakeFSSpec(0, 0, "\pVideo Texture Movie File", &movieFSS); err = CreateMovieFile(&movieFSS, 'TVOD', -1, createMovieFileDeleteCurFile, &movieResRef, &theMovie); if (err) return; // get the movie from the movie file err = OpenMovieFile(&movieReply.sfFile, &inputMovieResRef, fsRdPerm); if (err) return; err = NewMovieFromFile(&inputMovie, inputMovieResRef, nil, nil, 0, nil); if (err) return; CloseMovieFile(inputMovieResRef); // find the video track in the input movie inputVideoTrack = GetMovieIndTrackType(inputMovie, 1, VideoMediaType, movieTrackMediaType | movieTrackEnabledOnly); if (!inputVideoTrack) return; // copy the video track to the output movie err = AddEmptyTrackToMovie(inputVideoTrack, theMovie, nil, 0, &outputVideoTrack); if (err) return; err = InsertTrackSegment(inputVideoTrack, outputVideoTrack, 0, GetTrackDuration(inputVideoTrack), 0); if (err) return; // toss input movie DisposeMovie(inputMovie); // make up a 3d track, and media, very quickly threeDeeTrack = NewMovieTrack(theMovie, 320 << 16, 240 << 16, 0); // 320x240 pixels in size threeDeeMedia = NewTrackMedia(threeDeeTrack, 'qd3d', GetMovieTimeScale(theMovie), (Handle)alias, rAliasType); // make up a media that points to the 3dmf file // add the 3dmf file as a sample to the media (make it as long as the video track) err = AddMediaSampleReference(threeDeeMedia, 0, eof, GetMovieDuration(theMovie), (SampleDescriptionHandle)sampleDescription, 1, 0, nil); if (err) return; // add the 3d media into the track InsertMediaIntoTrack(threeDeeTrack, 0, 0, GetMediaDuration(threeDeeMedia), 1L << 16); // dispose unneeded things DisposeHandle((Handle)alias); DisposeHandle((Handle)sampleDescription); // create a reference to the video track from the 3d track err = AddTrackReference(threeDeeTrack, outputVideoTrack, kTrackModifierReference, &textureReference); if (err) return; // create an empty input map for the 3d track err = QTNewAtomContainer(&inputMap); if (err) return; err = addTextureEntryToInputMapEntry(inputMap, textureReference, "Joe"); if (err) return; // attach the input map to the 3d media handler err = SetMediaInputMap(threeDeeMedia, inputMap); if (err) return; // throw away the input map QTDisposeAtomContainer(inputMap); // add the movie resource to the movie file err = AddMovieResource(theMovie, movieResRef, nil, nil); if (err) return; // close the movie file CloseMovieFile(movieResRef); // toss that movie too (automatically tosses all tracks, media, etc). DisposeMovie(theMovie); } OSErr addTextureEntryToInputMapEntry(QTAtomContainer inputMap, long referenceIndex, char *name) { OSErr err; QTAtom inputAtom; long inputType = kTrackModifierTypeSpriteImage; // add a input entry to the input mape err = QTInsertChild(inputMap, kParentAtomIsContainer, kTrackModifierInput, referenceIndex, 0, 0, nil, &inputAtom); if (err) goto bail; // set the type of the modifier input err = QTInsertChild(inputMap, inputAtom, kTrackModifierType, 1, 0, sizeof(inputType), &inputType, nil); if (err) goto bail; // define the name if (name) { long nameLen = 1; Ptr p = name; while (*p++) nameLen++; err = QTInsertChild(inputMap, inputAtom, kTrackModifierInputName, 1, 0, nameLen, name, nil); if (err) goto bail; } bail: return err; }